/* 
 * generateur.js
 * 
 * Fonctions du générateur d'exercice de jmemor 
 * jmemor
 * (c) 2012 - Patrick Cardona
 * Version : 1.3.0
 * 
 * @source: http://code.google.com/p/jmemor/
 * 
 */

/* =================================================================== */
/* LICENCE
/* =================================================================== */
/*
@licstart  The following is the entire license notice for the 
    JavaScript code in this page.

Copyright (C) 2012  Patrick CARDONA

    The JavaScript code in this page is free software: you can
    redistribute it and/or modify it under the terms of the GNU
    General Public License (GNU GPL) as published by the Free Software
    Foundation, either version 3 of the License, or (at your option)
    any later version.  The code is distributed WITHOUT ANY WARRANTY;
    without even the implied warranty of MERCHANTABILITY or FITNESS
    FOR A PARTICULAR PURPOSE.  See the GNU GPL for more details.

    As additional permission under GNU GPL version 3 section 7, you
    may distribute non-source (e.g., minimized or compacted) forms of
    that code without the copy of the GNU GPL normally required by
    section 4, provided you include this license notice and a URL
    through which recipients can access the Corresponding Source.
    
@licend  The above is the entire license notice
    for the JavaScript code in this page.    
*/

/* =================================================================== */
/* !!!!!!!!!!!!!!!! AVERTISSEMENT  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* =================================================================== */
/* 
	!!! IMPORTANT !!! Ne touchez pas à ce fichier à moins de posséder de solides
	connaissances en javascript, DOM et JQuery !
*/

/* ****************** */
/* Variables globales */
/* ****************** */

function ojmemor(){
	this.app_name = "jmemor";
	this.theme=""; // Theme de la série
	this.auteur =""; // Professeur auteur de l'exercice
	this.version;
	this.series = []; // Series avec un S final !!! Pour la sauvegarde de la série saisie
}

function ocarte(){
	 
	this.paire = [];  // Carte : recto + verso
	this.serie = []; // Serie : sans S !!! Stockage intermédiaire des cartes
}

/*
 * Méthode Suppression d'une carte
 */
ocarte.prototype.supprimeCarte = function(_idx){
	this.serie.splice(_idx,1);
}

/*
 * Méthode Edition d'une carte
 */
ocarte.prototype.editeCarte = function(_idx){
	// On propage les données dans le formulaire pour édition :
	var recto = this.serie[_idx][0];
	var verso = this.serie[_idx][1];
	$("#carte_1").val(recto);
	$("#carte_2").val(verso);
	// On supprime cet enregistrement
	this.serie.splice(_idx,1);
}

ocarte.prototype.tableau = function(){
	
	var tab = "<table class='carte'>";
		tab += "<thead><tr><th>#</th><th>Recto</th><th>Verso</th><th class='action' colspan='2'>Actions</th></tr></thead>";
		tab += "<tbody>";
	if (this.serie.length > 0){
		for (var i=0; i < this.serie.length; i++){
			tab+= "<tr id='ligne_"+ i + "'>";
			tab+= "<td>"+ (i + 1) +"</td>";
			tab+= "<td>"+ this.serie[i][0] +"</td>";
			tab+= "<td>"+ this.serie[i][1] +"</td>";
			tab+= "<td class='editer_carte'><img src='generateur/img/editer.png'</td>";
			tab+= "<td class='supprimer_carte'><img src='generateur/img/poubelle.png'</td>";
			tab+= "</tr>";
		}
		
	}
	tab+= "</tbody></table>";
	
	$("#cartes_saisies").html( tab );	
}

  /*
   * Propager les données à partir du fichier lu dans le Local Storage :
   */
ocarte.prototype.propagerLesDonnees = function(key){
    var code = window.localStorage.getItem(key);
    var data = $.parseJSON(code);
    /*
     * On affiche un formulaire de création à remplir avec les données récupérées
     */
    
    /*
     * Récupération des données :
     */
      switch(data.app_name){
      	
      	case "jmemor":
      		// Données éditoriales :
	      	$("#edito_jmemor_0").val(data.theme);
	        $("#edito_jmemor_1").val(data.auteur);
	        
	        // On vide le tableau de stockage
	        this.serie = [];
	        
	        // On recupere les cartes : tableau associatif series qui contient des paires ques / ans
        	for(i=0;i<data.series.length;i++){
        		var recto = data.series[i]["ques"];
        		var verso = data.series[i]["ans"];
        		this.serie.push([recto, verso]);
        	}
        	
	        // On affiche la zone des données éditoriales et on masque la zone courante
	        $("*[div*=etape]").each(function(){
	        	$(this).hide();
	        });
	        
	        $("#etape_Action_Nouveau").show();
	        $("#etape_Action_Modifier").hide();
	        
	        $("#titre_aide").text("Pas à pas : jmemor");
			$("#contenu_aide").html(contenu_Pas_A_Pas_jmemor());
			$("#zone_aide").show();
			
			
      	break;
      	
      	
      	
      	default:
      	
      	break;
      }
           
  }
  
  /*
   * 
   */
  
    ocarte.prototype.listerJSON = function(){
    
    this.serie = new Array();
    
  	var sortie = "<p>";
  	if(window.localStorage.length > 0){
  		sortie += "Exercices enregistrés :</p><table id='jmemors'>";
  		for(key in localStorage){
  			var data = $.parseJSON(window.localStorage.getItem(key));
  			
  				sortie += "<tr id='"+ key +"'><td>" + data.theme + " (" + data.version + ")</td>";
  				sortie += "<td><img alt='Détail' src='generateur/img/loupe.png' /></td><td><img alt='Ouvrir' src='generateur/img/editer.png' />";
  				sortie += "</td><td><img src='generateur/img/poubelle.png' alt='Supprimer' /></td>";
  				sortie += "</tr>";
  			
  			}
  			
  		sortie += "</table>";
  		
  	}else{
  		sortie += "Aucun exercice enregistré.</p>";
  		
  	}
  	$("#liste_jmemors").html(sortie);
  	
  }
  
  /*
   *  Importer une série
   */
   ocarte.prototype.Importer = function(code){
    
    
  	if(code !=""){
  		try{
			var data = $.parseJSON(code);
			if(data.app_name == "JMemor"||data.app_name == "jmemor"){
			

		/*
		* On affiche un formulaire de création à remplir avec les données récupérées
		*/
    
    
      		// Données éditoriales :
	      	$("#edito_jmemor_0").val(data.theme);
	        $("#edito_jmemor_1").val(data.auteur);
	        
	        // On vide le tableau de stockage
	        this.serie = [];
	        
	        // On recupere les cartes : tableau associatif series qui contient des paires ques / ans
        	for(i=0;i<data.series.length;i++){
        		var recto = data.series[i]["ques"];
        		var verso = data.series[i]["ans"];
        		this.serie.push([recto, verso]);
        	}
        	/* On propage cette série au tableau de la série affichée dans l'interface */
        	this.tableau();
        	
        	
	        // On affiche la zone des données éditoriales et on masque la zone courante
	        $("*[div*=etape]").each(function(){
	        	$(this).hide();
	        });
	        
	        $("#etape_Action_Nouveau").show();
	        $("#etape_Action_Importer").hide();
	        
	        $("#titre_aide").text("Pas à pas : jmemor");
			$("#contenu_aide").html(contenu_Pas_A_Pas_jmemor());
			$("#zone_aide").show();
			
			
			} // fin if
           
			} // fin try
        
			
  		catch(e){
					$.Zebra_Dialog('Erreur de format : '+e.message,{
						'type': 'error',
						'title': 'Echec de l\'importation'
						});
			}
  		}else{
			$.Zebra_Dialog('Collez d\'abord du code dans la zone de texte.',{
				'type': 'error',
				'title': 'Aucun code'
				});
		}
  		
  		
  	
  } // Fin fonction
   
  
  /*
   * 
   */

function toJSON(_obj){
	return obj_json = JSON.stringify(_obj);
}


function obtientDate(){
	
	var mois=new Array();
	mois[0]="janvier";
	mois[1]="fevrier";
	mois[2]="mars";
	mois[3]="avril";
	mois[4]="mai";
	mois[5]="juin";
	mois[6]="juillet";
	mois[7]="aout";
	mois[8]="septembre";
	mois[9]="octobre";
	mois[10]="novembre";
	mois[11]="decembre";
	 
	var madate = new Date();
	var sceau = madate.getDate();
	sceau += mois[madate.getMonth()];
	sceau += madate.getFullYear() + "-";
	sceau += madate.getHours();
	sceau += "h" + madate.getMinutes();
	sceau += ":" + madate.getSeconds();
	return sceau;
}

/*
 * Génération du code de l'exercice jmemor
 */
ojmemor.prototype.genereCode = function(_serie){ // On passe en paramètre le tableau provisoire des cartes saisies
	
	for(var i = 0;i < _serie.length;i++){
		this.series.push({"ques":_serie[i][0],"ans":_serie[i][1]});
		}
	var code = toJSON(this);
	this.code = code;
	this.fic_code = "jmemor_"+ this.version;
	/*
	 * Stockage local de la série saisie
	 */
	localStorage.setItem(this.fic_code, this.code);
	
	new $.Zebra_Dialog("Données conservées sous l'index local <em>" + this.fic_code + "</em>", {
    'title': 'Sauvegarde automatique',
    'buttons':  false,
    'modal': false,
    'position': ['right - 20', 'top + 20'],
    'auto_close': 2000
});
	
	
}

/* *********************************************************
 *  Affichage des actions
 * *********************************************************
 */

// Mode éditeur
function action_Modifier(){
	var monAction = "<div id='etape_Action_Modifier'>";
	monAction += "<h2>Éditer un exercice de jmemor</h2>";	
  	monAction += "<div id='chemin_fichier'>";
  	monAction += "<form>";
  	monAction += "<fieldset><legend>Source de données :&nbsp;</legend>";
  	monAction += "<div id='liste_jmemors'>&nbsp;</div>";
  	monAction += "</fieldset>";
  	monAction += "</form></div></div>";		
  			
  	return monAction;		
}

/*
* Action nouvelle série
*/
function action_Nouveau(){
	var monAction = "<div id='etape_Action_Nouveau'>";
	monAction += "<h2>Configuration</h2>";
    monAction += "<form id='editoriales_jmemor'>";
    monAction += "<fieldset><legend>Données éditoriales obligatoires&nbsp;</legend>";
    monAction += "<table><tr><td>";
    monAction += "<label for='edito_jmemor_0'>Thème de la série :</label>";
    monAction += "</td><td><input type='text' id='edito_jmemor_0' name='theme_jmemor' value='Thème de la série…' />";
    monAction += "</td></tr><tr><td>";
    monAction += "<label for='edito_jmemor_1'>Auteur de la série :</label>";
    monAction += "</td><td><input type='text' id='edito_jmemor_1' name='auteur' />";
    monAction += "</td></tr></table></fieldset>";
    monAction += "<input type='submit' value='Enregistrer les paramètres' /></form></div>";
    
    return monAction;
     
}

/*
* Action saisie de la série…
*/
function action_Saisie_Serie(){
	var monAction ="<div id='etape_Action_Saisie_Serie'><h2>Saisie des cartes à mémoriser</h2>";   
  	monAction += "<form><fieldset><legend>Nouvelle carte : </legend>";
  	monAction += "<table><tr><td><label for='carte_1'>Recto :</label></td>";
  	monAction += "<td><input type='text' name='recto' id='carte_1' value='' /></td></tr>";
  	monAction += "<tr><td><label for='carte_2'>Verso :</label></td>";
  	monAction += "<td><input type='text' name='verso' id='carte_2' value='' /></td></tr></table>";
  	monAction += "<input type='submit' id='ajouter' value='Ajouter cette carte' />";
  	monAction += "</fieldset>";
  	monAction += "<fieldset><legend>Cartes ajoutées à la série : </legend>";
  	monAction += "<div id='cartes_saisies'>Aucune carte saisie.</div>";
  	monAction += "<input type='submit' id='enregistrer' value='Enregistrer cet exercice' /></fieldset></form>";
  	monAction += "</div>";
    
	return monAction;
}

function action_Code(){
	var monAction = "<div id='etape_Action_Code'><h2 id='titre10'>Données de l'exercice</h2>";
    monAction += "<p id='label_barre'>Génération du code :</p>";
    monAction += "<div id='bloc_barre'><div id='barre'></div></div>";
	monAction += "<div id='enregistrement'><img src='generateur/img/json.png' width='100px' align='left' alt='Données JSON' />";
	monAction += "<input type='submit' id='action_selection' value='Sélectionner le code' /><br />"
	monAction += "<textarea id='zonecode' cols='60' rows='10'></textarea></div></div>";
		
	return monAction;	
}

function action_Importer(){
	var monAction = "<div id='etape_Action_Importer'><h2>Importer un exercice</h2>";
    monAction += "<form><textarea id='zone_importation' cols='80' rows='6'$></textarea>";
	monAction += "<input type='submit' id='action_importer' value='Importer ce code' /></form>"
	monAction += "</div>";
		
	return monAction;	
}

function action_Copie_Exerciseur_jmemor(){
	
	var monAction = "<div id='etape_Action_Copie_Exerciseur_jmemor'><div id='exerciseur_jmemor'>";
	monAction += "<h2>Exerciseur de jmemor</h2>";
    monAction += "<form><img src='generateur/img/zip.png' width='100px' align='left' alt='Paquet Zip' />";
	monAction += "<input type='submit' value='Télécharger un exerciseur de jmemor...' />"; 	
	monAction +=  "</form></div></div>"; 	
	
	return monAction;
}

/* ******************************************************
 *    Contenus de l'aide
 * ******************************************************
 */

function contenu_Exerciseur_jmemor(){
		
		var contenu = "<ol><li>Obtenez une copie de l'exerciseur jmemor <code>jmemor.zip</code><br />";	
    	contenu += "en cliquant sur le bouton ci-contre&nbsp;;</li>";
    	contenu += "<li>Décompressez-la. Vous obtenez un dossier&nbsp;: <code>jmemor</code>&nbsp;;</li>";
    	contenu += "<li>Déplacez-y le fichier <code>data.json</code>.</li>";
    	contenu += "</ol>";
    	contenu += "<p>Pour publier cet exercice de jmemor sur un serveur, renommez, puis compressez à nouveau ce dossier ";
    	contenu += "<code>jmemor</code> mis à jour.</p>";
  		
		return contenu;
}
 
function contenu_Pas_A_Pas_jmemor(){
	var contenu =  "<ol><li>Créez le fichier de données <em>data.json</em> grâce au Générateur.</li>";
		contenu += "<li>Récupérez une copie de l'exerciseur jmemor <code>exercice-jmemor.zip</code> et décompressez-la.</li>";
		contenu += "<li>Copiez votre fichier <code>data.json</code> dans le dossier <code>exercice-jmemor</code>.</li>";
		contenu += "<li>Renommez le dossier <code>exercice-jmemor</code> sous un nom plus explicite.</li>";
		contenu += "<li>Créez une nouvelle archive <em>.zip</em> du dossier exercice-jmemor renommé.</li>";
		contenu += "<li>Déposez cette archive <code>votre_exercice.zip</code> à l'endroit désiré sur le serveur de cours.</li>";
		contenu += "<li>Décompressez l'archive <code>votre_exercice.zip</code> sur ce serveur. ";
		contenu += "<br />Voyez à ce propos la documentation de votre plate-forme de cours.</li>";
		contenu += "<li>Faites enfin un lien vers le fichier :<ul><li><code>JFC.html</code> pour une mémorisation.</li>";
		contenu += "<li><code>Quiz.html</code> pour une auto-évaluation des connaissances.</li></ul>";
		contenu += "<br />Voyez encore, si nécesaire, la documentation de votre plate-forme de cours.</li>";
		contenu += "</ol>";
		
		return contenu;
} 



function contenu_Principe(){
	var contenu = "<p>L'exercice s'exécute au moyen d'un fichier de données <code>data.json</code> et d'un exerciseur :";
		contenu += " le fichier d'interface <code>JFC.html</code> ou <code>Quiz.html</code>.</p>";
		contenu += "<p>Pour créer le fichier de données <code>data.json</code>, vous devez utiliser le Générateur de JMemor.</p>";
		contenu += "<p>Vous téléchargerez ensuite une copie de l'exerciseur approprié, <code>exercice-jmemor.zip</code>.</p>";
		contenu += "<p>Pour publier votre exercice, vous décompresserez d'abord <code>exercice-jmemor.zip</code>,";
		contenu += " vous copierez le fichier <code>data.json</code> dans le dossier décompressé <code>exercice-jmemor</code>.</p>";
		contenu += "<p>Le dossier de l'exercice, ainsi complété, sera finalement publié sur un serveur de ";
		contenu += "cours et vous ferez finalement un lien vers le fichier <code>JFC.html</code> ou <code>Quiz.html</code>.</p>";
		contenu += "<p>Voyez la procédure Pas à Pas&hellip;</p>";
		
		return contenu;
}

function contenu_Presentation(){
	var contenu = "<p>Jmemor permet de créer une série de cartes à mémoriser ou <em>flashcards</em>, ainsi que ";
		contenu += "l'exercice de <em>Quiz</em> associé à cette série.</p> ";
		contenu += "<p>Son objectif est d'assurer un fonctionnement ";
		contenu += "de cet exercice sur toutes les plateformes : PC, Mac, tablettes, etc.</p>";
		contenu += "<p>Pour voir un exemple :</p>";
		contenu += "<ul><li>De cartes à mémoriser : menu <em>Actions / exemple de Flashcards&nbsp;;</em></li>";
		contenu += "<li>De Quiz : menu <em>Actions / exemple de Quiz</em>.</li></ul>";
		contenu += "<p>Le présent générateur, qui permet de créer les données textuelles communes aux deux activités, ";
		contenu += "est une application Web en ligne.</p>";
		contenu += "<p>Pour créer :</p>";
		contenu += "<ul><li>Une nouvelles série de cartes : menu <em>Actions / nouvel exercice&hellip;</em></li></ul>";
		contenu += "<p>Les données de chaque exercice sont automatiquement enregistrées dans l'espace privé de l'application. ";
		contenu += "Pour modifier un exercice précédent&nbsp;:</p>";
		contenu += "<ul><li>Menu <em>Actions / éditer&hellip;</em></li></ul>";
		
		return contenu;
}

function contenu_Modifier(){
	var contenu = "<ul><li>Pour afficher le détail, cliquez sur la loupe... <img src='generateur/img/loupe.png' align='bottom' /></li>";
		contenu += "<li>Pour éditer un contenu, cliquez sur le crayon... <img src='generateur/img/editer.png' align='bottom' /></li>";
		contenu += "<li>Pour supprimer un contenu, cliquez sur la corbeille... ";
		contenu += "<img src='generateur/img/poubelle.png' align='bottom' /></li></ul>";
		
		return contenu;
}

function contenu_Importer(){
	var contenu = "<ul><li>Ouvrez dans un éditeur ou le bloc-notes un fichier de données <em>data.json</em>.</li>";
		contenu += "<li>Sélectionnez son contenu, copiez-le dans le presse-papier.</li>";
		contenu += "<li>Cliquez dans la zone de texte ci-contre, collez-y le contenu du presse-papier.</li>";
		contenu += "<li>Cliquez enfin sur le bouton <em>Importer ce code</em>.</li></ul>";
		return contenu;
}

function contenu_Code(){
	var info = "<ol><li>Copiez ce code dans le presse-papier : <em>édition / copier</em>.</li>";
	info += "<li>Ouvrez un fichier vierge dans un éditeur de texte : Bloc-Notes, TextEdit, etc.</li>";
	info += "<li>Collez le contenu du presse-papier dans ce fichier : <em>édition / coller</em>.</li>";
	info += "<li>Enregistrez ce fichier sous le nom : <em>data.json</em>.</li>";
	info += "<li>Revenez dans le générateur de jmemor.</li>";
	info += "<li>Procurez-vous une copie de l'exerciseur, jmemor : menu <em>Actions / Copie de cet exerciseur&hellip;</em>.</li></ol>";
	
	return info;
}

function pied_bis(){
	// Pied de page BIS 
  var pied = "<footer><img src='generateur/img/icon_128.png' alt='logo' width='10%' /> ";
  pied += "jmemor - © 2012 Patrick Cardona</footer>";

	return pied;
}

/*
 * Gestion des infos stockées dans le Local Storage
 */

function lireFichier(key) {
    
    // On charge les données de cet exercice
    
    // On récupère le nom du fichier...
    var code = window.localStorage.getItem(key);
    var data = $.parseJSON(code);
	
        var sortie = "Exerciseur : <em>" + data.app_name + "</em><br />"; // Application 
        sortie += "Auteur de cet exercice : <em>" + data.auteur + "</em><br />"; // Auteur de l'exercice
        sortie += "Thème de la série : <em>" + data.theme + "</em><br />"; // Thème de la série
        sortie += "Version : <em>" + data.version + "</em></p>";
        
        return sortie;
  }
  
  /*
   * Supprimer une version
   */
  function supprimeFichier(key) {

    // On supprime les données de cet exercice ?
    
    
    $.Zebra_Dialog('Supprimer cet exercice ?', {
    'type':     'question',
    'title':    'Suppression du contenu stocké',
    'buttons':  [
                    {caption: 'Oui', callback: function() { 
						// On supprime l'enregistrement de la base locale...
						window.localStorage.removeItem(key);
						$("#contenu_fichier").html("");
						drapeau = 1;   		
						$("a[title='Modifier']").click(); // Appel récursif pour forcer l'actualisation avec FF
						new $.Zebra_Dialog("Le contenu référencé par la clé "+ key +" a été supprimé.", {
						'title': 'Suppression du contenu',
						'buttons':  false,
						'modal': false,
						'position': ['right - 20', 'top + 20'],
						'auto_close': 2000
						});

						}},
                    {caption: 'Non', callback: function() { 
							$("#contenu_fichier").html("");							
						}}
                    
                ]
			});
   
		
	  
  }

